package Day_0201.JUC;

/**
 * @author zxc
 * @date 2023/02/01 22:56
 **/
public class BlockingQueue {
    public static void main(String[] args) {
        /**
         * 阻塞队列
         * ===》
         * 1.阻塞队列（BlockingQueue）是支持两个附加操作的队列。
         * （1）在队列为空时，获取元素的线程会等待队列变为非空。
         * （2）当队列满时，存储元素的线程会等待队列可用。
         *
         * 2.阻塞队列的应用场景
         * （1）阻塞队列常用于生产者和消费者的场景，生产者是往队列里添加元素的线程，消费者是从队列里拿元素的线程。
         * （2）阻塞队列就是生产者存放元素的容器，而消费者也只从容器里拿元素。
         * ===》 阻塞队列通常用于生产者-消费者模式;
         *
         * 3.JDK7提供了7个阻塞队列 ：
         * （1）ArrayBlockingQueue ：
         *  一个由数组结构组成的有界阻塞队列。
         * （2）LinkedBlockingQueue ：
         *  一个由链表结构组成的有界阻塞队列。
         * （3）PriorityBlockingQueue ：
         *  一个支持优先级排序的无界阻塞队列。
         * （4）DelayQueue：
         *  一个使用优先级队列实现的无界阻塞队列。
         * （5）SynchronousQueue：
         *  一个不存储元素的阻塞队列。
         * （6）LinkedTransferQueue：
         *  一个由链表结构组成的无界阻塞队列。
         * （7）LinkedBlockingDeque：
         *  一个由链表结构组成的双向阻塞队列。
         *
         * 4.实现生产者-消费者模式
         * （1）Java 5之前实现同步存取时，可以使用普通的一个集合，然后再使用线程的协作和线程同步可以实现生产者，消费者模式，
         *  主要的技术就是用好wait ,notify,notifyAll,sychronized这些关键字。
         * （2）在java 5之后，可以使用阻塞队列来实现，此方式大大简少了代码量，使得多线程编程更加容易，安全方面也有保障。
         *
         * 5.阻塞队列用途
         * （1）BlockingQueue接口是Queue的子接口，
         * （2）主要用途并不是作为容器，而是作为线程同步的的工具，
         *  a.当生产者线程试图向BlockingQueue放入元素时，如果队列已满，则线程被阻塞，
         *  b.当消费者线程试图从中取出一个元素时，如果队列为空，则该线程会被阻塞，
         * （3）正是因为它所具有这个特性，所以在程序中多个线程交替向BlockingQueue中放入元素，取出元素，它可以很好的控制线程之间的通信。
         * ===》
         * 即，BlockingQueue主要用于线程同步/线程通信;
         *
         * 6.阻塞队列的经典场景
         * （1）阻塞队列使用最经典的场景就是socket客户端数据的读取和解析，
         * （2）读取数据的线程不断将数据放入队列，
         * （3）然后解析线程不断从队列取数据解析。
         *
         */
    }
}
